/**
 * This file is part of 1genia trampoline
 * Copyright (C) 2007 1genia (contact@1genia.com)
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; version 3 of the License. 
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details. 
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; see the file COPYING.TXT.  If not,
 * write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA 02110-1301, USA. 
 **/
package com.genia.toolbox.uml_generator.transformer;


import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

import com.genia.toolbox.uml_generator.bean.ModelGeneratorContext;
import com.genia.toolbox.uml_generator.model.EnumerationModel;
import com.genia.toolbox.uml_generator.model.impl.EnumerationLiteralModelImpl;

/**
 * this class handle the input of nodes from xmi to enumerationModel.
 */
public abstract class AbstractEnumInputHandler
    extends AbstractInputHandler<Object>
{

  /**
   * the factory for {@link EnumerationModel}.
   * 
   * @return a new {@link EnumerationModel}
   */
  public abstract EnumerationModel createEnumerationModel();



  /**
   * the actual method that parse the current {@link Element}.
   * @param context
   *          the generation context
   * @param firstPass
   *          wether it is the first or second pass
   * @param element
   *          the element to parse
   * @param parent
   *          the generated parent model
   */
  public void processContent(final ModelGeneratorContext context, final boolean firstPass, final Element element, final Object parent)
  {
    EnumerationModel enumerationModel = null;

    if (firstPass) {
      enumerationModel = createEnumerationModel();
      fillCommonValue(context, element, enumerationModel);

      for (Element enumElement : getElementsByPath(context, element, "UML:Enumeration.literal", "UML:EnumerationLiteral")) {
        EnumerationLiteralModelImpl enumerationLiteralModel = new EnumerationLiteralModelImpl();
        fillCommonValue(context, enumElement, enumerationLiteralModel);
        enumerationModel.addEnumerationLiteralModel(enumerationLiteralModel);
      }
      if (!StringUtils.hasText(enumerationModel.getComment())) {
        context.getErrors().add("Enumeration " + enumerationModel.getQualifiedName() + " must have a comment.");
      }
      context.addEnumeration(enumerationModel);
    }
    else {
      enumerationModel = (EnumerationModel) context.getObject(element.getAttribute("xmi.id"));

      // inheritance
      handleAbstraction(context, element, enumerationModel);

      // operation from enumeration.
      handleOperation(context, element, enumerationModel);
    }
  }

}
